Summary after Robosense's Interview

 昨天第一次到 xx 参观学习,略有点仓促地进行了笔试和面试,整体状态不好,可能没做好心理准备吧。感觉:Robosense 不显山不露水!
 下面是对期间觉得含糊不清的问题的整理。

C++ 基础部分

  • 把内存泄露和内存溢出弄混了
    • 泄漏是说你的程序有BUG,导致内存不释放;溢出是指内存不够用了,导致不够用的原因很多,泄漏只是其中一种。
    • wokaotesting:内存溢出和内存泄漏的区别
      • 内存泄露(memory leak)是指你的应用使用资源之后没有及时释放,导致应用内存中持有了不需要的资源,这是一种状态描述;
      • 内存溢出(out of memory)是指你的应用的内存已经不能满足正常使用了,堆栈已经达到系统设置的最大值,进而导致崩溃,这是一种结果描述;

        申请了一个 int,但给它存了 long 才能存下的数,那也是内存溢出

      • 通常都是由于内存泄露导致堆栈内存不断增大,从而引发内存溢出。
  • 怀疑自己写的 C++ 输入输出运算符重载
  • 1
    2
    3
    4
    friend istream& operator >>(istream &in, 自定义类型名 &形参名) {
    in >> ......
    return in;
    }
  • 1
    2
    3
    4
    friend ostream& operator <<(ostream &out, 自定义类型名 &形参名) {
    out << ......
    return out;
    }

 注:因为第一个参数是流对象,所以不能声明为其它类的成员函数,只能声明为友元函数(friend)或普通函数。如果声明为该类的成员函数,那么第一个参数就不是流对象,而是当前类的对象。

  • C语言中如何获取指定位置[start, ..., start+n-1]的子串
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    char *strncpy(char *dest, const char *src,int count);
    /*
    * 函数功能: 将字符串 src 中的 count 个字符拷贝到字符串 dest 中去
    * 函数返回: 指向 dest 的指针
    * 参数说明: dest-目的字符串,src-源字符串,count-拷贝的字符个数
    */
    #include <string.h>

    strncpy(dest, src+start, n);
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void *memcpy(void *dest, const void *src, size_t n);
    /*
    * 函数功能: 将字符串 src 中的 n 个字符拷贝到字符串 dest 中去
    * 函数返回: 指向 dest 的指针
    * 参数说明: dest-目的字符串,src-源字符串,n-拷贝的字符个数
    */
    #include <string.h>
    #include <mem.h>

    memcpy(dest, src+start, n);
  • C语言中的 strcpystrcat等字符串函数模棱两可
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    #include <string.h>

    // 串拷贝
    char *strcpy(char *str1, char *str2);
    char *strncpy(char *destin, char *source, int maxlen);

    // 字符串拼接函数
    char *strcat(char *destin, char *source);

    // 串比较:看 ASCII 码,str1>str2,返回值 > 0;两串相等,返回 0
    int strcmp(char *str1, char *str2);
    // 以大小写不敏感方式比较两个串
    int strcmpi(char *str1, char *str2);
    // 部分串比较
    int strncmp(char *str1, char *str2, unsigned maxlen);
    int strncmpi(char *str1, char *str2, unsigned maxlen);

    // 在串中查找指定字符串
    /*
    * 返回第一次出现位置后半段子串
    */
    char *strstr(char *str1, char *str2);
    char string[SIZE];
    char *ptr;
    strcpy(string, str1);
    ptr = strstr(string, c);
    // 获取下标
    ptr - string

    // 分割字符串
    char *strtok(char *str1, char *str2);
    // 返回前半段
    strtok(input, ",");
    // 返回后半段
    strtok(NULL, ",");

Refer: C语言字符串函数大全

LiDAR 算法部分

Hector SLAM有闭环检测吗?会存在什么问题?

2D激光SLAM算法比较+cartographer

  • Hector SLAM优点
    • 不需要使用里程计,所以使得空中无人机及地面小车在不平坦区域建图存在运用的可行性;
    • 利用 高斯牛顿方法 解决 scan-matching 问题(是对所有点云吗?),获得激光点集映射到已有地图的刚体变换(x, y, theta);
    • 利用已经获得的地图对激光束点阵进行优化,估计激光点在地图的表示和占据网格的概率;
    • 为避免局部最小而非全局最优,使用多分辨率地图;
    • 导航中的状态估计加入惯性测量系统(IMU),利用EKF滤波?
  • Hector SLAM缺点
    • 需要激光雷达(LRS)的更新频率较高,测量噪声小;
    • 在制图过程中,需要 robot 速度控制在比较低的情况下,建图效果才会比较理想,这也是它 没有回环(loop close)的一个后遗症;
    • 在里程计数据比较精确的时候,无法有效利用里程计信息,估计融合这一块没怎么考虑,靠激光雷达单挑
      ② 使用过的另外一种算法 gmapping
  • 缺点:依赖里程计(odometry),无法适用无人机及地面小车不平坦区域;无回环
  • 优点:在长廊及低特征场景中建图效果好。
    ③ 我们的使用情况
  • Hector SLAM

    该系统虽然没有严格的闭环反馈和检测,但是在室内和一些常见环境(包括走廊), Hector SLAM 已经足够精确。

  • gmapping
    • laser_scan_matcher: faking odometry using 2D LiDAR

      使用点线特征的 ICP 变种

      • The C(anonical) Scan Matcher (CSM) is a pure C implementation of a very fast variation of ICP using a point-to-line metric optimized for range-finder scan matching.
      • Censi A. An ICP variant using a point-to-line metric[C]//Robotics and Automation, 2008. ICRA 2008. IEEE International Conference on. IEEE, 2008: 19-25.
    • 运用在和 Hector SLAM 同样的环境下,建图效果没有 Hector SLAM 好(有走廊)
      • 可能是 gmapping 比较依赖 odometry,而 laser_scan_matcher 对于走廊这种特征不明显场景,匹配效果不好(AMCL 中使用 laser_scan_matcher 进行里程估算定位效果也不佳)。
      • 可能是 gmapping 本身鲁棒 Hector SLAM 没有好
  • 在AMCL 定位中使用 Hector mapping 进行里程估算能够得到最佳定位效果:精度+实时性
    • 定量分析?
    • 定性分析:进门这个特定场景

④ 2D SLAM 闭环检测???

AI 算法部分

  • 聚类分类的异同/KNN 是分类?K-means 是聚类?
  • SVM 增加训练集为什么效果并没有改善?
  • bias 和 variance?over-fitting 和 under-fitting?
  • adaboost?
  • 随机森林?
文章目录
  1. 1. C++ 基础部分
  2. 2. LiDAR 算法部分
  3. 3. AI 算法部分